# coding:utf-8
import re
import json
import traceback

import pymysql
from functools import reduce
from lxml import etree
from tools.insert_update import insert_sql
from configs.cfg import *


class ParseData:
    def parse_href(self, doc, emt, url):
        # 查找所有的链接（img标签除外）由于img标签没有href属性，可直接找带href的元素即可
        # href_emt= emt.xpath('*[@href and not(img)]@href')
        re.compile(r'http[s]://')
        # href_emt = emt.xpath('//*[@href]/@href') + [url[0] for url in re.findall(
        #     r'((https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;\u4e00-\u9fa5]+)', resp)]
        href_emt_li = emt.xpath('//body//*[@href and @title!=""]')
        href_li = []
        for href_emt in href_emt_li:
            href_dic = {}
            href_dic['title'] = href_emt.xpath('.//@title')[0].strip()
            href_dic['href'] = href_emt.xpath('.//@href')[0].strip()
            href_li.append(href_dic)

        # 删除数据中没用的href
        allHref = [hrefs for hrefs in href_li if hrefs['href']]
        # 删除多余的href
        a_href = [href_obj for href_obj in allHref if
                  '.css' not in href_obj['href'] and href_obj['href'] != "#" and 'javascript' not in href_obj[
                      'href'] and '.js' not in href_obj['href'] and '.png' not in href_obj['href'] and '.jpg' not in
                  href_obj['href'] and '.gif' not in href_obj['href'] and '.jpeg' not in href_obj['href']]
        # 给所有的子href添加域名
        for href_obj0 in a_href:
            if href_obj0['href'].startswith("http"):
                pass
            else:
                href_obj0['href'] = url + '/' + href_obj0['href'].strip()
        # findHrefs = [href_obj0 if href_obj0['href'].startswith("http") else url + '/' + href_obj0['href'].strip() for
        #              href_obj0 in a_href]
        # 对所有的href进行去重
        result_hrefs = self.clean_dic(a_href)
        result_hrefs = result_hrefs if result_hrefs else ''
        # print('result_hrefs:',result_hrefs)
        facebook_url = emt.xpath('//a[contains(@href,"facebook.com/")]/@href')[0] if emt.xpath(
            '//a[contains(@href,"facebook.com/")]/@href') else ''
        twitter_url = emt.xpath('//a[contains(@href,"twitter.com/")]/@href')[0] if emt.xpath(
            '//a[contains(@href,"twitter.com/")]/@href') else ''
        linkedin_url = emt.xpath('//a[contains(@href,"linkedin.com/")]/@href')[0] if emt.xpath(
            '//a[contains(@href,"linkedin.com/")]/@href') else ''
        youtube_url = emt.xpath('//a[contains(@href,"youtube.com/")]/@href')[0] if emt.xpath(
            '//a[contains(@href,"youtube.com/")]/@href') else ''
        instagram_url = emt.xpath('//a[contains(@href,"instagram.com/")]/@href')[0] if emt.xpath(
            '//a[contains(@href,"instagram.com/")]/@href') else ''

        # if facebook_url and not facebook_url.startswith('http'):
        #     facebook_url = 'http://' + facebook_url.strip('/')

        return facebook_url, youtube_url, twitter_url, linkedin_url, instagram_url, result_hrefs

    def parse_tel_fax_email(self, resp):
        # print(resp)
        # 匹配TEL
        reg_tel = re.compile(
            r'(Tel|Telefon|电话|手机|Phone|联系|联系方式|专线|热线|致电|call|電話)[ ]?[.:：]?([ \d()+-.]{2,})',
            re.I | re.S)
        # 匹配FAX
        reg_fax = re.compile(r'(FAX|传真)[.:：]?[ ]?([ \d()+-.]+)', re.I | re.S)
        # 匹配email Career.kl@ap.sony.com
        reg_mail = re.compile(r'\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*', re.I | re.S)
        results = reg_tel.findall(resp)
        tel = [tel[1].strip() for tel in results if tel[1]]
        tel = tel if len(tel) > 1 else ''.join(tel)
        fax = reg_fax.search(resp).group(2) if reg_fax.search(resp) else ''
        email = reg_mail.search(resp).group() if reg_mail.search(resp) else ''
        # print('tel:', tel, 'fax:', fax, 'email:', email)
        return str(tel), fax, email

    def parse_dc_kw(self, emt):
        # 获取数据元数据标签
        metas = emt.xpath('//meta')
        # 存放Description内容
        desc_li = []
        # 存放Keywords内容
        kw_li = []
        for meta in metas:
            # 判断meta标签中是否含有description
            if 'description' in etree.tostring(meta).decode().lower():
                # 含有字段，content内容也有可能为空，判断一下
                content = meta.xpath('./@content')[0] if meta.xpath('./@content') else ''
                # description内容去重: 遍历set转换
                if content not in desc_li:
                    desc_li.append(content)

            if 'keywords' in etree.tostring(meta).decode().lower():
                kw_content = meta.xpath('./@content')[0] if meta.xpath('./@content') else ''
                if kw_content not in kw_li:
                    kw_li.append(kw_content)

        return ','.join(desc_li), ','.join(kw_li)

    def conn_mysql(self, datas):
        # 获取连接对象
        # -- 批量插入去重url，存在更新，不存在新增，UPDATE后的字段不添加则不会修改
        # INSERT INTO website100_parse_fields (url,facebook,fax) VALUES('http://www.cnmc.com.cn','123','1214' ),('http://www.baidu.com','34231','2222'),('http://www.wellcare.com','4234123','234')
        # ON DUPLICATE KEY UPDATE facebook=VALUES(facebook),fax = VALUES(fax)

        conn = pymysql.connect(host=mysql_host, user=mysql_name, password=mysql_pwd,
                               database='source', port=mysql_port, charset='utf8')
        # 获取执行工具
        conn.ping()
        cur = conn.cursor()
        # sql语句,增删改
        # sql = 'select birthday from t_user'
        # 批量插入数据，并去重
        table_name = 'website_fields_parse'
        fields = (
            'url', 'is_ok', 'plaintext', 'description', 'keywords', 'facebook', 'youtube', 'twitter', 'linkedin',
            'instagram',
            'hrefs', 'tel', 'fax', 'email')
        try:
            sql = insert_sql(table_name, fields, datas)
            # print(sql)
            # sql = f'INSERT INTO website100_parse_fields(url, is_ok, text, keywords, description, facebook, youtube, twitter, linkedin, instagram, hrefs, tel, fax, email) VALUES' + str(datas).strip('[]')
            cur.execute(sql)
            conn.commit()
            print('Success!')
        except:
            print('website insert failed!')
            traceback.print_exc()
            # conn.rollback()
        # 关闭
        cur.close()
        conn.close()

    # def fail_request_conn_mysql(self, fail_data):
    #     conn = pymysql.connect(host=mysql_host, user=mysql_name, password=mysql_pwd,
    #                            database='source', port=121, charset='utf8')
    #     # 获取执行工具
    #     cur = conn.cursor()
    #     # 要插入的字段
    #     fields = ('url', 'is_ok')
    #     table_name = 'website1000_parse_fields'
    #     try:
    #         sql = insert_sql(table_name, fields, fail_data)
    #         # sql = f'INSERT INTO website100_parse_fields(url, is_ok, text, keywords, description, facebook, youtube, twitter, linkedin, instagram, hrefs, tel, fax, email) VALUES' + str(datas).strip('[]')
    #         cur.execute(sql)
    #         conn.commit()
    #         print('fail log committed')
    #     except Exception as e:
    #         conn.rollback()
    #         # 关闭
    #     cur.close()
    #     conn.close()

    @staticmethod
    def clean_dic(list):
        run_function = lambda x, y: x if y in x else x + [y]
        return reduce(run_function, [[], ] + list)


if __name__ == '__main__':
    datas = [('http://www.fujimarukun.co.jp', 1, '株式会社 藤商事,2021.12.24,P とある魔術の禁書目録新スペックを公開いたしました,2021.12.20,Pとある科学の超電磁砲機種情報を公開いたしました,2021.11.29,Pとある科学の超電磁砲LINE友だちプレゼントキャンペーン,2021.11.08,P 地獄少女 華LINE友だちプレゼントキャンペーン,2021.09.03,P 地獄少女 華機種情報を公開いたしました,2021.12.20,パチスロ リング 運命の秒刻LINE友だちプレゼントキャンペーン,2021.10.22,パチスロ リング 運命の秒刻機種情報を公開いたしました,2020.03.02,S 地獄少女 あとはあなたが決めることよLINE友だちプレゼントキャンペーン,2020.02.12,「S地獄少女 あとはあなたが決めることよ」東京名古屋ファン試打会開催情報を公開いたしました,2020.01.24,S地獄少女 あとはあなたが決めることよ機種情報を公開いたしました,2020.12.21,P とある魔術の禁書目録公式ホームページを公開いたしました,2020.03.19,P 地獄少女四公式ホームページを公開いたしました,2019.04.25,CR 緋弾のアリア AA公式ホームページを公開いたしました,2018.04.26,CR リング 終焉ノ刻公式ホームページを公開いたしました,2018.03.28,23/7 トゥエンティ スリー セブン公式ホームページを公開いたしました,製品情報ニュース一覧はこちら,2021.12.20『Ｐとある科学の超電磁砲（レールガン）』発売のお知らせを掲載いたしました,2021.12.03第57期第2四半期FUJIビジネスリポートを掲載いたしました,2021.10.292022年3月期第2四半期決算説明資料を掲載いたしました,2021.10.292022年3月期第2四半期決算短信を掲載いたしました,2021.10.22『Ｓリング\u3000運命の秒刻』発売のお知らせを掲載いたしました,企業IRニュース一覧はこちら藤商事公式Twitterの「偽アカウント」にご注意ください。詳しくはこちらをご覧ください当社および当社グループ会社を騙った「サクラ打ち子」、「パチンコパチスロの攻略法」などの不審な勧誘にご注意ください。詳しくはこちらをご覧ください コーポレートサイトTOPページニュース一覧機種ラインナップ全機種ラインナップゲームアプリラインナップ遊技小冊子一覧導入店舗検索How to Play会員登録一般会員ログインホール会員ログインメディア会員ログインカタログをお持ちのホール会員ログインアプリ会員ログインパスワードをお忘れの方※パチンコパチスロは18歳になってから。※パチンコパチスロは適度に楽しむ遊びです。のめり込みに注意しましょう。鎌池和馬／冬川基／アスキーメディアワークス／PROJECT-RAILGUN鎌池和馬／冬川基／アスキーメディアワークス／PROJECT-RAILGUNS2018 鎌池和馬／冬川基／ＫＡＤＯＫＡＷＡ／PROJECT-RAILGUNT1998「リング」「らせん」製作委員会東映地獄少女プロジェクト／宵伽製作委員会赤松中学\u30002008-20112011 赤松中学株式会社KADOKAWAメディアファクトリー刊／東京武偵高校BaeSo真島ヒロ／講談社\u3000真島ヒロ講談社／フェアリーテイル製作委員会テレビ東京\u3000鎌池和馬/アスキーメディアワークス/PROJECT-INDEX鎌池和馬/アスキーメディアワークス/PROJECT-INDEXⅡ鎌池和馬/アスキーメディアワークス/PROJECT-INDEXMOVIE2017 鎌池和馬／ＫＡＤＯＫＡＷＡ\u3000アスキーメディアワークス／PROJECT-INDEXⅢJFJ CO., LTD. ALL RIGHTS RESERVED.SUNSOFT FUJISHOJI CO., LTD. ALL RIGHTS RESERVED.サイトマッププライバシーポリシーこのサイトのご利用方法', 'パチンコ、パチスロ製品の機種情報をご覧いただけます。パチンコ、パチスロ（スロット）製品なら藤商事。', '製品,最新,機種,パチンコ,パチスロ,メーカー,藤商事,FUJI', 'https://www.facebook.com/fujimarukun777', 'https://www.youtube.com/channel/UC5Gczn2J9pdfhj7hORCk0XA', 'https://twitter.com/fujimarukun777', '', '', '', '', '', '')]
    ParseData().conn_mysql(datas)
